<?php
/**
 * User: LRZ
 * Date: 2020/1/13
 * Time: 22:06
 */

/**
 *  283.移动零
 *
 *  标签：数组、双指针
 *
 *  给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。
 *
 *  示例:
 *  输入: [0,1,0,3,12]
 *  输出: [1,3,12,0,0]
 *
 *  说明:
 *  必须在原数组上操作，不能拷贝额外的数组。
 *  尽量减少操作次数。
 *
 *  来源：力扣（LeetCode）
 *  链接：https://leetcode-cn.com/problems/move-zeroes
 *  著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

$start = microtime(true);

$nums = [0, 1, 0, 3, 12];
$res  = moveZeroes($nums);

$end = microtime(true);
print_r($res);
printf(' total run: %.2f s<br>' . 'memory usage: %.2f M<br> ', $end - $start, memory_get_usage() / 1024 / 1024);

function moveZeroes(&$nums)
{
    $p = 0;
    foreach ($nums as $k => $v) {
        if ($v !== 0) {
            $nums[$p++] = $v;
        }
    }

    for ($i = $p, $iMax = count($nums); $i < $iMax; $i++) {
        $nums[$i] = 0;
    }
    return $nums;
}